package fr.afcepf.ai91.qualimetrie.data;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import fr.afcepf.ai91.qualimetrie.entity.Adresse;
import fr.afcepf.ai91.qualimetrie.util.UtilConnexionAi91;

public class DaoAdresseImpl implements IDaoAdresse {

/**
 * requete pour ajouter une adresse dans la BDD.
 */
    // final evite la modification des paramètres de la requete.
    private final String reqAjout = "insert into adresse (numero, rue, code_postal,ville, pays) values(?,?,?,?,?)";
    /**
     * Indice du num pour l'ajout d'une adresse.
     */
    private final int indiceNumAdresse = 1;
    /**
     * Indice de la rue pour l'ajout d'une adresse.
     */
    private final int indiceRueAdresse = 2;
    /**
     * Indice de la ville pour l'ajout d'une adresse.
     */
    private final int indiceVilleAdresse = 3;
    /**
     * Indice du code postal pour l'ajout d'une adresse.
     */
    private final int indiceCpAdresse = 4;
    /**
     * Indice du pays pour l'ajout d'une adresse.
     */
    private final int indicePaysAdresse = 5;
    @Override
    public Adresse ajouter(Adresse paramAdr) {
        Connection cnx = UtilConnexionAi91.getConnection();
        try {
            PreparedStatement pstmt = cnx.prepareStatement(reqAjout, Statement.RETURN_GENERATED_KEYS);
            pstmt.setString(indiceNumAdresse, paramAdr.getNum());
            pstmt.setString(indiceRueAdresse, paramAdr.getRue());
            pstmt.setString(indiceVilleAdresse, paramAdr.getVille());
            pstmt.setString(indiceCpAdresse, paramAdr.getCp());
            pstmt.setString(indicePaysAdresse, paramAdr.getPays());
            // executeUpdate renvoie un nombre de lignes
            int nbLigne = pstmt.executeUpdate();
            if (nbLigne == 1) {
                ResultSet rs = pstmt.getGeneratedKeys();
                // on itère sur le resultSet
                if (rs.next()) { // 1 seule ligne donc utilisation de if. Si plusieurs lignes, utilisation de while()
                    paramAdr.setId(rs.getInt(1)); // 1 corresond à nbLigne; ici on a une seul ligne d'où le 1.
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
             // fermeture de la connexion
                cnx.close();
            } catch (SQLException e2) {
                e2.printStackTrace();
            }
        }
        return paramAdr;
    }

}
